package com.example.mypplication.opengl

import android.opengl.GLES20
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.FloatBuffer

class Triangle {
    private val vertexBuffer: FloatBuffer
    private val mProgram: Int
    private var mPositionHandle = 0
    private var mColorHandle = 0

    companion object {
        // 每个顶点的坐标数
        const val COORDS_PER_VERTEX = 3

        // 三角形顶点坐标
        val triangleCoords = floatArrayOf(
            0.0f, 0.622008459f, 0.0f,    // 顶部
            -0.5f, -0.311004243f, 0.0f,   // 左下
            0.5f, -0.311004243f, 0.0f     // 右下
        )
    }

    // 设置颜色，RGBA格式
    private val color = floatArrayOf(0.63671875f, 0.76953125f, 0.22265625f, 1.0f)

    init {
        // 初始化顶点字节缓冲区
        val bb = ByteBuffer.allocateDirect(
            triangleCoords.size * 4 // 每个float 4字节
        ).apply {
            order(ByteOrder.nativeOrder())
        }

        vertexBuffer = bb.asFloatBuffer().apply {
            put(triangleCoords)
            position(0)
        }

        // 准备着色器程序
        val vertexShader = MyGLRenderer.loadShader(
            GLES20.GL_VERTEX_SHADER,
            MyGLRenderer.vertexShaderCode
        )
        val fragmentShader = MyGLRenderer.loadShader(
            GLES20.GL_FRAGMENT_SHADER,
            MyGLRenderer.fragmentShaderCode
        )

        // 创建空的OpenGL ES程序
        mProgram = GLES20.glCreateProgram().also {
            // 添加顶点着色器到程序中
            GLES20.glAttachShader(it, vertexShader)

            // 添加片段着色器到程序中
            GLES20.glAttachShader(it, fragmentShader)

            // 创建OpenGL ES程序可执行文件
            GLES20.glLinkProgram(it)
        }
    }

    fun draw() {
        // 将程序添加到OpenGL ES环境
        GLES20.glUseProgram(mProgram)

        // 获取顶点着色器的vPosition成员的句柄
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition")

        // 启用三角形顶点位置的句柄
        GLES20.glEnableVertexAttribArray(mPositionHandle)

        // 准备三角形坐标数据
        GLES20.glVertexAttribPointer(
            mPositionHandle, COORDS_PER_VERTEX,
            GLES20.GL_FLOAT, false,
            0, vertexBuffer
        )

        // 获取片段着色器的vColor成员的句柄
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor")

        // 设置绘制三角形的颜色
        GLES20.glUniform4fv(mColorHandle, 1, color, 0)

        // 绘制三角形
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3)

        // 禁用顶点数组
        GLES20.glDisableVertexAttribArray(mPositionHandle)
    }
}